import { BaseRepository } from '#src/common/repositories/BaseRepository.js';
import UserQueries from '#src/database/queries/user.queries.js';
import { logger } from "#src/common/utils/logger.js";
import { verifyPassword, hashPassword } from '#src/common/utils/password.util.js';

/**
 * 用户数据访问层，处理用户相关的数据库操作
 * 继承自BaseRepository，提供用户查询、创建及角色关联等功能
 * @class UserRepository
 * @extends BaseRepository
 * @module UserModule
 */
export class UserRepository extends BaseRepository {
    /**
     * 创建UserRepository实例
     * @constructor
     * @description 初始化父类BaseRepository，指定表名为'users'并关联用户查询语句
     */
    constructor() {
        super('users', UserQueries);
    }

    /**
     * 根据邮箱查询用户
     * @async
     * @param {string} email - 用户邮箱地址
     * @returns {Promise<Object|null>} - 返回用户对象或null（未找到时）
     * @description 执行findByEmail查询，返回第一个匹配结果或null
     */
    async findByEmail(email) {
        const results = await this.execute('findByEmail', { email }, {
            context: 'findByEmail'
        });
        return results[0] || null;
    }

    /**
     * 根据ID查询用户
     * @async
     * @param {string} id - 用户唯一标识符
     * @returns {Promise<Object|null>} - 返回用户对象或null（未找到时）
     * @description 执行findById查询，返回第一个匹配结果或null
     */
    async findById(id) {
        const results = await this.execute('findById', { id }, {
            context: 'findById'
        });
        return results[0] || null;
    }

    /**
     * 创建用户并分配角色（事务操作）
     * @async
     * @param {Object} userData - 用户数据对象
     * @param {string} userData.id - 用户ID
     * @param {string} userData.email - 用户邮箱
     * @param {string} userData.username - 用户名
     * @param {string} userData.password - 用户密码（明文）
     * @param {string} userData.status - 用户状态
     * @param {string} userData.created_at - 创建时间
     * @param {string} userData.updated_at - 更新时间
     * @param {number} roleId - 角色ID
     * @returns {Promise<Object>} - 返回包含用户ID的结果对象
     * @throws {AppError} - 当事务执行失败时抛出
     * @description 执行两阶段事务：1.哈希密码并创建用户 2.为用户分配角色
     */
    async createUserWithRole(userData, roleId) {
        try {
            // 哈希密码（使用bcrypt进行加密）
            const hashedPassword = await hashPassword(userData.password);

            // 执行事务：创建用户并分配角色
            const results = await this.executeTransaction([
                {
                    queryName: 'createUser',
                    params: {
                        id: userData.id,
                        email: userData.email,
                        username: userData.username,
                        password: hashedPassword, // 存储哈希后的密码
                        status: userData.status,
                        created_at: userData.created_at,
                        updated_at: userData.updated_at
                    }
                },
                {
                    queryName: 'createUserRole',
                    params: {
                        userId: userData.id,
                        roleId
                    }
                }
            ]);
            logger.info('用户创建并分配角色成功', {
                userId: userData.id,
                roleId,
                email: userData.email
            });

            // 使用事务执行结果中的返回值
            // 假设事务执行结果中包含插入ID等信息，这里简单返回第一个操作的结果
            return results[0] || { insertId: userData.id };
        } catch (error) {
            logger.error('用户创建或角色分配失败', {
                error: error.message,
                email: userData.email
            });
            throw new AppError('用户创建失败', 'USER_CREATION_ERROR', { error: error.message });
        }
    }
    /**
     * 查询用户的角色列表
     * @async
     * @param {string} userId - 用户ID
     * @returns {Promise<Array<Object>>} - 返回角色对象数组
     * @description 执行getUserRoles查询，获取用户关联的所有角色信息
     */
    async getUserRoles(userId) {
        return this.execute('getUserRoles', { userId }, {
            context: 'getUserRoles'
        });
    }
}